home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / powervww / pvstddlg.cpp < prev    next >
C/C++ Source or Header  |  1998-01-05  |  20KB  |  877 lines

  1. //  ____________________________________________________
  2. // |                                                    |
  3. // |  Project:     POWER VIEW INTERFACE                 |
  4. // |  File:        PVSTDDLG.CPP                         |
  5. // |  Compiler:    WPP386 (10.6)                        |
  6. // |                                                    |
  7. // |  Subject:     Standard dialog boxes implementation |
  8. // |                                                    |
  9. // |  Author:      Emil Dotchevski                      |
  10. // |____________________________________________________|
  11. //
  12. // E-mail: zajo@geocities.com
  13. // URL:    http://www.geocities.com/SiliconValley/Bay/3577
  14.  
  15. #define uses_fcntl
  16. #define uses_stdarg
  17. #define uses_stdio
  18. #define uses_string
  19. #define uses_app
  20. #define uses_desk
  21. #define uses_dialog
  22. #define uses_help
  23. #define uses_icons
  24. #define uses_input
  25. #define uses_stddlg
  26. #define uses_system
  27. #define uses_txt
  28.  
  29. #define DECLARE_PVSTDDLG
  30. #include "PVuses.h"
  31. #undef DECLARE_PVSTDDLG
  32.  
  33. #define _ICON_NOTHING   1
  34. #define _ICON_WARNING   2
  35. #define _ICON_QUESTION  3
  36. #define _ICON_INFO      4
  37.  
  38. uint test_file_exist( char *path )
  39. {
  40.   int handle;
  41.   if( !_dos_open( path, O_RDONLY, &handle ) )
  42.   {
  43.     char s[_MAX_PATH];
  44.     _dos_close( handle );
  45.     strcpy( s, path );
  46.     fexpand( s ); min_path( s ); short_path( s, 29 );
  47.     _iwarning();
  48. #ifdef CYR
  49.     return ync( "éÑ╖Ñ ▒║╣Ñ▒▓ó│óá ┤á⌐½ %s.\n\nçá¼┐¡á ¡á ▒║╣Ñ▒▓ó│óá╣¿┐ ┤á⌐½?", s );
  50. #else
  51.     return ync( "File %s already exists.\n\nReplace existing file?", s );
  52. #endif
  53.   }
  54.   return 0;
  55. }
  56.  
  57. //OPEN FILE DIALOG
  58.  
  59. static char dir[_MAX_DIR+_MAX_DRIVE];
  60. static char filter[_MAX_FNAME];
  61. static Tlist_box *files=NULL;
  62. static Tlist_box *dirs;
  63. static Tcombo_box *filters;
  64. static Tcombo_box *drives;
  65. static Tinput *item_name;
  66. static Tdtext *show_dir;
  67. static Tdtext *show_info;
  68. static boolean new_file_fl;
  69. static boolean overflow;
  70.  
  71. struct Tfile_rec
  72. {
  73.   char attr;
  74.   uint time;
  75.   uint date;
  76.   long size;
  77. };
  78.  
  79. static void get_info_str( Tfile_rec &d, char *result )
  80. {
  81.   char m[14];
  82.   uint year;
  83.   char month, day, hours, minutes, seconds;
  84. #ifndef CYR
  85.   char *am;
  86. #endif
  87.  
  88.   if( d.attr & _A_SUBDIR )
  89. #ifdef CYR
  90.     strcpy( result, "ÅỬᠠ  " );
  91. #else
  92.     strcpy( result, "Directory" );
  93. #endif
  94.   else
  95.     sprintf( result, "%-9lu", d.size );
  96.   unpack_time( d.time, hours, minutes, seconds );
  97.   unpack_date( d.date, year, month, day );
  98.   if( month ) month--;
  99.   memcpy( m, months[month], 3 ); m[3] = 0;
  100. #ifdef CYR
  101.   sprintf( result + 9, " %2d %s, %4d %2d:%02d", day, m, year, hours, minutes );
  102. #else
  103.   if( hours < 12 )
  104.     am = "am";
  105.   else
  106.   {
  107.     am = "pm";
  108.     hours -= 12;
  109.   }
  110.   if( !hours ) hours = 12;
  111.   sprintf( result + 9, " %s %2d, %4d %2d:%02d%s", m, day, year, hours, minutes, am );
  112. #endif
  113. }
  114.  
  115. static void file_change( void )
  116. {
  117.   char s[_MAX_PATH], *p;
  118.   int i;
  119.   Tfile_rec d;
  120.  
  121.   if( !files->vcount ) return;
  122.   files->gettxt( files->vcurrent, s );
  123.   item_name->set_txt( s );
  124.   files->getdata( files->vcurrent, &d );
  125.   p  = strchr( s, 0 );
  126.   for( i = 0; i < ( _MAX_FNAME + _MAX_EXT ); i++ )
  127.     *(p++) = ' ';
  128.   get_info_str( d, s + _MAX_FNAME + _MAX_EXT );
  129.   show_info->set_txt( s );
  130. }
  131.  
  132. static void dir_change( void )
  133. {
  134.   char s[_MAX_PATH], r[_MAX_PATH], *p;
  135.   int i;
  136.   Tfile_rec d;
  137.  
  138.   if( !dirs->vcount ) return;
  139.   dirs->gettxt( dirs->vcurrent, s );
  140.   sprintf( r, "%s\\%s", s, filter );
  141.   item_name->set_txt( r );
  142.   dirs->getdata( dirs->vcurrent, &d );
  143.   p  = strchr( s, 0 );
  144.   for( i = 0; i < ( _MAX_FNAME + _MAX_EXT ); i++ )
  145.     *(p++) = ' ';
  146.   get_info_str( d, s + _MAX_FNAME + _MAX_EXT );
  147.   show_info->set_txt( s );
  148. }
  149.  
  150. static void reread( void )
  151. {
  152.   struct find_t dir_info;
  153.   char tmp_drive[_MAX_DRIVE];
  154.   char tmp_path[_MAX_PATH];
  155.   char tmp_name[_MAX_FNAME];
  156.   char tmp_ext[_MAX_EXT];
  157.   char path[_MAX_PATH];
  158.   char *p;
  159.   int done;
  160.   uint index;
  161.   Tfile_rec fd;
  162.  
  163.   item_name->get_txt( path );
  164.   while( ( p = strchr( path, ' ' ) ) != NULL )
  165.     strcpy( p, p+1 );
  166.   if( ( *path == 0 ) || ( ( path[0] != '\\' ) && ( path[1] != ':' ) ) )
  167.   {
  168.     strcpy( tmp_path, path );
  169.     strcpy( path, dir );
  170.     strcat( path, tmp_path );
  171.   }
  172.   fexpand( path );
  173.   _splitpath( path, tmp_drive, dir, tmp_name, tmp_ext );
  174.   if( ( *tmp_name != 0 ) || ( *tmp_ext != 0 ) )
  175.   {
  176.     strcpy( filter, tmp_name );
  177.     strcat( filter, tmp_ext );
  178.   }
  179.   strcpy( path, tmp_drive );
  180.   strcat( path, dir );
  181.   strcat( path, filter );
  182.   short_path( path, 48 );
  183.   show_dir->set_txt( path );
  184.   strcpy( path, dir );
  185.   strcpy( dir, tmp_drive );
  186.   strcat( dir, path );
  187.   strcpy( path, filter );
  188.   item_name->set_txt( path );
  189.   show_info->set_txt( "" );
  190.   for( ;; )
  191.   {
  192.     strcpy( tmp_path, dir );
  193.     strcat( tmp_path, filter );
  194.     files->clear();
  195.     critical_error();
  196.     for( done=_dos_findfirst(tmp_path,_A_NORMAL,&dir_info);
  197.          !done;
  198.          done=_dos_findnext(&dir_info) )
  199.     {
  200.       fd.attr = dir_info.attrib;
  201.       fd.time = dir_info.wr_time;
  202.       fd.date = dir_info.wr_date;
  203.       fd.size = dir_info.size;
  204.       _ldata( &fd ); files->add( dir_info.name );
  205.     }
  206.     files->sort();
  207.     files->top();
  208.     if( files->overflow ) overflow = 1;
  209.  
  210.     strcpy( tmp_path, dir );
  211.     strcat( tmp_path, "*.*" );
  212.     dirs->clear();
  213.     for( done=_dos_findfirst(tmp_path,_A_SUBDIR,&dir_info);
  214.          !done;
  215.          done=_dos_findnext(&dir_info) )
  216.       if( ( strcmp( dir_info.name, "." ) && ( dir_info.attrib & _A_SUBDIR ) ) )
  217.       {
  218.         fd.attr = dir_info.attrib;
  219.         fd.time = dir_info.wr_time;
  220.         fd.date = dir_info.wr_date;
  221.         fd.size = dir_info.size;
  222.         _ldata( &fd ); dirs->add( dir_info.name );
  223.       }
  224.     dirs->sort();
  225.     dirs->top();
  226.     if( dirs->overflow ) overflow = 1;
  227.  
  228.     sprintf( tmp_path, "[-%c-]", tmp_drive[0] );
  229.     if( ( index = drives->findft( tmp_path ) ) != (uint) -1 )
  230.       drives->set_data( index );
  231.     if( done!=18 )
  232.       if( critical_error() )
  233.       {
  234.         files->clear();
  235.         dirs->clear();
  236.         if( drive_error( tmp_drive[0] ) ) continue;
  237.       }
  238.       else
  239.       {
  240.         _terror();
  241.         ok( "Cant read disk directory.\n\n(Does such directory exist?)" );
  242.       }
  243.     break;
  244.   }
  245.   if( current() == dirs )
  246.     dir_change();
  247.   else
  248.     if( current() == files )
  249.       file_change();
  250.     else
  251.       focus( files );
  252.   modal_broadcast( cmDLG_RESET );
  253. }
  254.  
  255. static void open_file_handler( Titem *p )
  256. {
  257.   char s[_MAX_PATH], *n;
  258.  
  259.   if( p == files )
  260.     file_change();
  261.   else
  262.     if( p == dirs )
  263.       dir_change();
  264.     else
  265.       if( p == drives )
  266.       {
  267.         drives->get_data( s );
  268.         *dir = s[2];
  269.         strcpy( dir+1, ":\\" );
  270.         item_name->set_txt( "" );
  271.         reread();
  272.       }
  273.       else
  274.         if( p == filters )
  275.         {
  276.           filters->get_data( s );
  277.           n = strchr( s, '(' ) + 1;
  278.           *strchr( n, ')' ) = 0;
  279.           item_name->set_txt( n );
  280.           reread();
  281.         }
  282. }
  283.  
  284. static boolean open_file_validator( uint x )
  285. {
  286.   char path[_MAX_PATH];
  287.   char tmp_drive[_MAX_DRIVE];
  288.   char tmp_dir[_MAX_DIR];
  289.   char tmp_name[_MAX_FNAME];
  290.   char tmp_ext[_MAX_EXT];
  291.   char *l;
  292.   uint xx;
  293.  
  294.   switch( x )
  295.   {
  296.     case cmVALID:
  297.       return !overflow;
  298.     case cmOK:
  299.       item_name->get_txt( path );
  300.       l = strchr( path, 0 );
  301.       if( *(l - 1) == ':' )
  302.       {
  303.         *(l++) = '\\';
  304.         *l = 0;
  305.       }
  306.       if( ( strchr( path, '*') == NULL ) && ( strchr( path, '?' ) == NULL ) && ( *( strchr( path, 0 ) - 1 ) != '\\' ) )
  307.       {
  308.         _splitpath( path, tmp_drive, tmp_dir, tmp_name, tmp_ext );
  309.         if( !*tmp_dir && !*tmp_drive )
  310.         {
  311.           strcpy( tmp_dir, dir+2 );
  312.           *tmp_drive = *dir;
  313.         }
  314.         if( !*tmp_ext ) strcpy( tmp_ext, strchr( filter, '.' ) );
  315.         if( ( strchr( tmp_ext, '*' ) != NULL ) || ( strchr( tmp_ext, '?' ) != NULL ) ) strcpy( tmp_ext, "." );
  316.         _makepath( path, tmp_drive, tmp_dir, tmp_name, tmp_ext );
  317.         fexpand( path );
  318.         if( new_file_fl && (xx=test_file_exist(path)) )
  319.         {
  320.